package ar.com.aterrizar.asientos;

import org.uqbar.commons.utils.Observable;
import org.uqbar.commons.utils.Transactional;

import uqbar.arena.persistence.annotations.PersistentClass;

import ar.com.aterrizar.aerolineas.AeroLanchita;
import ar.com.aterrizar.aerolineas.AeroOceanic;
import ar.com.aterrizar.aerolineas.Aerolinea;
import ar.com.aterrizar.entidades.Cliente;
import ar.com.aterrizar.entidades.TipoDeClaseAsiento;
import ar.com.aterrizar.entidades.TipoDeUbicacionAsiento;
import ar.com.aterrizar.fecha.*;
import ar.com.aterrizar.operaciones.Reserva;
@Transactional
@Observable
@PersistentClass
public class AsientoOceanic extends Asiento {

	private String codVuelo;
	private Integer numAsiento;
	private Fecha fechaYHoraLlegada;
	private Fecha fechaYHoraSalida;
	private String origen;
	private String destino; 
	private Float precio;
	private TipoDeClaseAsiento clase;
	private TipoDeUbicacionAsiento ubicacion;
	private Boolean disponibilidad;
	private Reserva reserva=new Reserva();
	private AeroOceanic aerolinea;
	private String fechaDeSalida;
	
	
	public AsientoOceanic(String codAsiento, Integer numAsiento, String fechaYHoraLlegadaString, String fechaYHoraSalidaString, String origen, String destino,
			Float precio, TipoDeClaseAsiento clase,
			TipoDeUbicacionAsiento ubicacion, Boolean disponibilidad){
		
		
		this.codVuelo = codAsiento;
		this.numAsiento = numAsiento;
		this.fechaYHoraLlegada = new Fecha(fechaYHoraLlegadaString);
		this.fechaYHoraSalida = new Fecha(fechaYHoraSalidaString);
		this.origen = origen;
		this.destino = destino;
		this.precio = precio;
		this.clase = clase;
		this.ubicacion = ubicacion;
		this.disponibilidad = disponibilidad;
		aerolinea = AeroOceanic.getInstance();
		
		
	}
	
	/**
	 *Solo para test
	 * 
	 * @param codAsiento
	 */
	public AsientoOceanic(String codAsiento, Integer numAsiento){
		this.codVuelo = codAsiento;
		this.numAsiento = numAsiento;
		this.fechaYHoraLlegada = new Fecha("20/12/2012 20:00");
		this.fechaYHoraSalida = new Fecha("21/12/2012 19:00");
		this.origen = "_NY";
		this.destino = "SLA";
		this.precio = (float) 150;
		this.clase = TipoDeClaseAsiento.PRIMERACLASE;
		this.ubicacion = TipoDeUbicacionAsiento.VENTANA;
		this.disponibilidad = true;
		aerolinea = AeroOceanic.getInstance();
		this.fechaDeSalida = fechaYHoraLlegada.getFecha().toString();
	}
	
	
	public Integer getNumAsiento(){
		return numAsiento;
	}
	
	
	public Fecha getFechaDeSalidaYHora() {
		return fechaYHoraSalida;
	}
	
	
	public Fecha getFechaDeLlegadaYHora() {
		return fechaYHoraLlegada;
	}
	
	
	public String getOrigen() {
		return origen;
	}
	
	
	public String getDestino() {
		return destino;
	}
	
	
	public Aerolinea getAerolinea(){
		return this.aerolinea;
	}
	
	public String getAerolineaNombre(){
		return this.aerolinea.getAerolinea();
	}
	
	public TipoDeClaseAsiento getClase() {
		return clase;
	}
	
	
	public TipoDeUbicacionAsiento getUbicacion() {
		return ubicacion;
	}
	
	
	public Float getPrecio(Cliente cliente) {
		if(cliente.tenesCuenta()){	
			return getPrecioBase();
		}
		return (getPrecioBase() + cliente.recargoDeCuenta());
	}
	
	
	
	public String getCodVuelo() {
		return codVuelo;
	}
	
	
	public void setReserva(Reserva reserva) {
		this.reserva = reserva;
	}
	
	
	public Reserva getReserva() {
		return reserva;
	}
	
	
	public Boolean getDisponibilidad() {
		return disponibilidad;
	}

	
	public long getTiempoDeVuelo() {
		return fechaYHoraLlegada.getFecha().getTime() - fechaYHoraSalida.getFecha().getTime();
	}

	
	public String getCodigoDeAsiento() {
		return getCodVuelo() +"-"+ getNumAsiento().toString();
	}


	
	private Float getPrecioBase() {
		return precio;
	}

	
	public Cliente getClienteQueReservo() {
		return this.getReserva().getClientes().get(0);
	}
	
	public String getFechaDeSalida(){
		return fechaDeSalida;	
	}

	@Override
	public Boolean estaReservado() {
		return !this.disponibilidad;
	}

	
	@Override
	public Boolean estaReservado(Cliente cliente) {
		for(Asiento asiento:cliente.getAsientosReservados()){
			if(asiento.getCodigoDeAsiento().equals(this.getCodigoDeAsiento())){
				return true;
			}
		}
		return false;
	}

	@Override
	public Boolean estaComprado() {
		for(Asiento asiento:this.aerolinea.vuelosComprados()){
			if(this.getCodigoDeAsiento().equals(asiento.getCodigoDeAsiento())){
				return true;
			}
		}
		return false;
	}

	@Override
	public Float getPrecio() {
		return this.precio;
	}

	@Override
	public Fecha getFechaYHoraSalida() {
		return this.fechaYHoraSalida;
	}

	@Override
	public Fecha getFechaYHoraLlegada() {
		return this.fechaYHoraLlegada;
	}

	@Override
	public void setPrecio(float precio) {
		this.precio=precio;
	}

	@Override
	public void setClase(TipoDeClaseAsiento clase) {
		this.clase=clase;
	}

	@Override
	public void setUbicacion(TipoDeUbicacionAsiento ubicacion) {
		this.ubicacion=ubicacion;
	}

	@Override
	public void setDisponibilidad(boolean disponibilidad) {
		this.disponibilidad=disponibilidad;
	}

	@Override
	public void setOrigen(String origen) {
		this.origen=origen;
	}

	@Override
	public void setDestino(String destino) {
		this.destino=destino;
	}

	@Override
	public void setFechaYHoraSalida(Fecha fecha) {
		this.fechaYHoraSalida=fecha;
	}

	@Override
	public void setFechaYHoraLlegada(Fecha fecha) {
		this.fechaYHoraLlegada=fecha;
	}

	@Override
	public void setAerolinea(Aerolinea aerolinea) {
		this.aerolinea=(AeroOceanic) aerolinea;
	}

	@Override
	public void setFechaDeSalida(String fecha) {
		this.fechaDeSalida=fecha;
	}

}
